﻿using System;
using System.Diagnostics;
using System.Globalization;
using System.Windows.Forms;
using Business;
using Business.Entity.Configuracao;
using Business.Entity.Contabil;
using Business.Entity.Contabil.Pessoa.SubClass.Usuario.ClassesRelacionadas;
using Business.Entity.Vendas.MovimentacaoCaixa.SubClass.LancamentoInicial;
using Business.Entity.Vendas.MovimentacaoCaixa.SubClass.Sangria;
using Business.Forms;
using Business.Seguranca;
using Business.Validation;
using DevExpress.CodeParser;
using DevExpress.XtraEditors;
using Ecf;

namespace Vendas.Forms
{
    public partial class FormLancamentoInicial : FormDefault, IForm
    {
        public FormLancamentoInicial()
        {
            InitializeComponent();


            txtDataMovimento.EditValue = DateTime.Now;
            DialogResult = DialogResult.None;
            New();


        }

        private void cmdSalvar_Click(object sender, EventArgs e)
        {
            lancamentoInicialBindingSource.EndEdit();


        }


        private void cmdCancelar_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void FormLancamentoInicial_KeyDown(object sender, KeyEventArgs e)
        {

        }

        public object Save()
        {
            lancamentoInicialBindingSource.EndEdit();
            var l = (LancamentoInicial)lancamentoInicialBindingSource.DataSource;
            l.Historico = "LANCAMENTO INICIAL";
            Utils.Configuracao.DiaProcessamento = txtDataMovimento.DateTime;
            l.Usuario = Utils.UsuarioAtual;
            l.Caixa = Utils.Terminal.ConfiguracaoEcf.Caixa;
            l.DataMovimento = Utils.Configuracao.DiaProcessamento;
            l.Valor = decimal.Parse(valorSpinEdit.Value.ToString(CultureInfo.InvariantCulture));
            if (Validate().HasError)
            {
                return null;
            }
            else
            {
                ConfiguracaoGeralRepository.Save(Utils.Configuracao);
                LancamentoInicialRepository.Save(l);
                DialogResult = DialogResult.OK;
                if (!LancarCaixa(l.Valor))
                {
                    return null;
                }

            }
            Close();
            return l;
        }

        private bool LancarCaixa(decimal valor)
        {
            var ret = EcfHelper.GetEcf().ImprimeLeituraX();
            if (valor > 0)
            {
                if (ret)
                {
                    EcfHelper.GetEcf().Suprimento(valor, "LANCAMENTO INICIAL");
                }
            }

            return ret;
        }

        public void Update(object entity)
        {
            throw new NotImplementedException();
        }

        public bool Delete(object entity)
        {
            throw new NotImplementedException();
        }

        public object CurrentObject
        {
            get
            {
                lancamentoInicialBindingSource.EndEdit();
                return lancamentoInicialBindingSource.DataSource;
            }
            set
            {
                lancamentoInicialBindingSource.DataSource = value;
            }
        }

        public PermissaoForm Permissao
        {
            get
            {
                return SegurancaUtils.GetPermissaoForm(Name);
            }
        }

        public EntityValidationResult Validate()
        {
            return DataValidation.ValidateEntity(CurrentObject);
        }

        public void Reload()
        {

        }

        public void Cancel()
        {
            DialogResult = DialogResult.Cancel;
            Close();
        }

        public object New()
        {
            lancamentoInicialBindingSource.DataSource = new LancamentoInicial();
            return CurrentObject;
        }

        public XtraForm Form
        {
            get
            {
                return this;
            }
        }

        public FormState FormState { get; set; }

        private void FormLancamentoInicial_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (DialogResult == DialogResult.None || DialogResult == DialogResult.Cancel)
            {
                var msg = "Deseja realmente cancelar a inicialização do caixa?";
                if (MessageBox.Show(msg, "Atenção", MessageBoxButtons.YesNo) == DialogResult.No)
                {
                    MessageBox.Show("Será emitida uma leitura X para inicialização do caixa.");
                    LancarCaixa(0);
                }
                else
                {
                    Process.GetCurrentProcess().Kill();
                }

            }
        }

        private void FormLancamentoInicial_Activated(object sender, EventArgs e)
        {
            try
            {
                var dataMovimento = EcfHelper.GetEcf().DataMovimento();
                //var ultimaZ = EcfHelper.GetEcf().UltimaReducaoZ();
                //if (ultimaZ != null)
                //{
                //    if (ultimaZ.Data == DateTime.Now && dataMovimento.Ticks <= 1)
                //    {
                //        MessageBox.Show("A redução Z já foi emitida para este dia.\n A aplicação será encerrada.");
                //        Process.GetCurrentProcess().Kill();
                //    }

                //}
                if (LancamentoInicialRepository.DiaLancado(Utils.Terminal.ConfiguracaoEcf.Caixa) != null)
                {
                    DialogResult = DialogResult.OK;
                    Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Erro ao iniciar sistema.\n" + ex.Message);
                Process.GetCurrentProcess().Kill();
            }

        }
    }
}